<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('department_reports', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            // 报表基本信息
            $table->string('report_type', 50); // organizational, attendance, staffing, comprehensive
            $table->string('report_period', 20); // daily, weekly, monthly, quarterly, yearly
            $table->date('report_date'); // 报表日期
            $table->string('period', 20)->nullable(); // 2024-01, 2024-Q1, 2024

            // 部门信息
            $table->unsignedBigInteger('department_id');
            $table->string('department_name', 100);
            $table->string('department_code', 50)->nullable();
            $table->integer('department_level')->default(1); // 部门层级
            $table->string('department_path', 500)->nullable(); // 部门路径

            // 组织架构信息
            $table->unsignedBigInteger('manager_id')->nullable(); // 部门经理ID
            $table->string('manager_name', 100)->nullable(); // 部门经理姓名
            $table->unsignedBigInteger('deputy_manager_id')->nullable(); // 副经理ID
            $table->string('deputy_manager_name', 100)->nullable(); // 副经理姓名

            // 人员统计
            $table->integer('total_positions')->default(0); // 总岗位数
            $table->integer('occupied_positions')->default(0); // 已占用岗位数
            $table->integer('vacant_positions')->default(0); // 空缺岗位数
            $table->integer('total_employees')->default(0); // 总员工数
            $table->integer('active_employees')->default(0); // 在职员工数
            $table->integer('on_leave_employees')->default(0); // 请假员工数

            // 岗位配置统计
            $table->integer('key_positions')->default(0); // 关键岗位数
            $table->integer('management_positions')->default(0); // 管理岗位数
            $table->integer('technical_positions')->default(0); // 技术岗位数
            $table->integer('operational_positions')->default(0); // 操作岗位数

            // 考勤统计（当报表类型包含考勤时）
            $table->integer('present_today')->default(0); // 今日出勤
            $table->integer('absent_today')->default(0); // 今日缺勤
            $table->integer('late_today')->default(0); // 今日迟到
            $table->integer('leave_today')->default(0); // 今日请假
            $table->decimal('attendance_rate', 5, 2)->nullable(); // 出勤率

            // 招聘预警统计
            $table->integer('understaffed_positions')->default(0); // 缺员岗位数
            $table->integer('overstaffed_positions')->default(0); // 超员岗位数
            $table->integer('critical_vacancies')->default(0); // 关键岗位空缺
            $table->integer('active_warnings')->default(0); // 活跃预警数

            // 薪资统计
            $table->decimal('total_salary_budget', 12, 2)->nullable(); // 薪资预算总额
            $table->decimal('actual_salary_cost', 12, 2)->nullable(); // 实际薪资成本
            $table->decimal('average_salary', 10, 2)->nullable(); // 平均薪资

            // 培训发展统计
            $table->integer('employees_with_training')->default(0); // 已培训员工数
            $table->integer('training_hours_this_period')->default(0); // 本期培训小时数
            $table->decimal('training_budget_used', 10, 2)->nullable(); // 培训预算使用

            // 绩效统计
            $table->decimal('average_performance_score', 5, 2)->nullable(); // 平均绩效分数
            $table->integer('high_performers')->default(0); // 高绩效员工数
            $table->integer('low_performers')->default(0); // 低绩效员工数

            // 状态管理
            $table->string('status', 20)->default('draft'); // draft, generated, reviewed, approved
            $table->datetime('generated_at')->nullable(); // 生成时间
            $table->datetime('reviewed_at')->nullable(); // 审核时间
            $table->string('reviewed_by', 100)->nullable(); // 审核人

            // 报表数据（JSON格式存储详细数据）
            $table->json('organizational_data')->nullable(); // 组织架构数据
            $table->json('attendance_data')->nullable(); // 考勤数据
            $table->json('staffing_data')->nullable(); // 人员配置数据
            $table->json('performance_data')->nullable(); // 绩效数据

            // 备注
            $table->text('notes')->nullable();

            // 创建者信息
            $table->string('created_by', 100)->nullable();
            $table->string('updated_by', 100)->nullable();

            // 索引
            $table->index(['report_type', 'report_date'], 'dr_type_date_idx');
            $table->index(['department_id', 'report_date'], 'dr_dept_date_idx');
            $table->index(['period'], 'dr_period_idx');
            $table->index(['status'], 'dr_status_idx');
            $table->index(['manager_id'], 'dr_manager_idx');

            // 外键约束
            $table->foreign('department_id')->references('id')->on('departments')->onDelete('cascade');
            $table->foreign('manager_id')->references('id')->on('users')->onDelete('set null');
            $table->foreign('deputy_manager_id')->references('id')->on('users')->onDelete('set null');

            // 唯一约束：同一部门、同一报表类型、同一日期只能有一条记录
            $table->unique(['department_id', 'report_type', 'report_date'], 'unique_dept_report');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('department_reports');
    }
};
